package xyz.magicjson.core.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.HashMap;
import java.util.Map;

/**
 * ESB配置属性类，用于从application.yml或application.properties中读取配置。
 */
@Data
@ConfigurationProperties(prefix = "easy-esb")
public class ESBProperties {

    /**
     * 是否启用ESB
     */
    private boolean enabled = true;
    
    /**
     * ESB核心配置
     */
    private Core core = new Core();
    
    /**
     * 适配器配置
     */
    private Adapters adapters = new Adapters();
    
    /**
     * 安全配置
     */
    private Security security = new Security();
    
    /**
     * 日志配置
     */
    private Logging logging = new Logging();
    
    /**
     * 核心配置
     */
    @Data
    public static class Core {
        /**
         * 是否启用核心功能
         */
        private boolean enabled = true;
        
        /**
         * 线程池配置
         */
        private ThreadPool threadPool = new ThreadPool();
        
        /**
         * 线程池配置
         */
        @Data
        public static class ThreadPool {
            /**
             * 核心线程数
             */
            private int coreSize = 10;
            
            /**
             * 最大线程数
             */
            private int maxSize = 20;
            
            /**
             * 队列容量
             */
            private int queueCapacity = 100;
            
            /**
             * 线程名称前缀
             */
            private String namePrefix = "esb-thread-";
            
            /**
             * 空闲线程保持时间（秒）
             */
            private int keepAliveSeconds = 60;
        }
    }
    
    /**
     * 适配器配置
     */
    @Data
    public static class Adapters {
        /**
         * HTTP适配器配置
         */
        private Http http = new Http();
        
        /**
         * SOAP适配器配置
         */
        private Soap soap = new Soap();
        
        /**
         * 自定义适配器配置
         */
        private Map<String, Map<String, Object>> custom = new HashMap<>();
        
        /**
         * HTTP适配器配置
         */
        @Data
        public static class Http {
            /**
             * 是否启用HTTP适配器
             */
            private boolean enabled = true;
            
            /**
             * 端口
             */
            private int port = 8080;
            
            /**
             * 上下文路径
             */
            private String contextPath = "/api";
            
            /**
             * 最大请求大小（字节）
             */
            private int maxRequestSize = 10485760; // 10MB
        }
        
        /**
         * SOAP适配器配置
         */
        @Data
        public static class Soap {
            /**
             * 是否启用SOAP适配器
             */
            private boolean enabled = true;
            
            /**
             * WSDL路径
             */
            private String wsdlPath = "/wsdl";
            
            /**
             * 端点URL路径
             */
            private String endpointUrl = "/ws";
        }
    }
    
    /**
     * 安全配置
     */
    @Data
    public static class Security {
        /**
         * 是否启用安全功能
         */
        private boolean enabled = true;
        
        /**
         * 认证类型
         */
        private String authenticationType = "none"; // none, basic, oauth2
        
        /**
         * 加密算法
         */
        private String encryptionAlgorithm = "AES";
        
        /**
         * 是否启用HTTPS
         */
        private boolean httpsEnabled = false;
        
        /**
         * HTTPS证书路径
         */
        private String keyStore = "";
        
        /**
         * HTTPS证书密码
         */
        private String keyStorePassword = "";
    }
    
    /**
     * 日志配置
     */
    @Data
    public static class Logging {
        /**
         * 是否启用日志
         */
        private boolean enabled = true;
        
        /**
         * 日志级别
         */
        private String level = "INFO";
        
        /**
         * 是否记录请求体
         */
        private boolean logRequestBody = true;
        
        /**
         * 是否记录响应体
         */
        private boolean logResponseBody = true;
        
        /**
         * 是否使用异步日志
         */
        private boolean async = true;
    }
} 